导入 sys
导入 os

sys.path.追加(os.路径.绝对路径(r'G:\grasspy_zwmodules\pywebio\zwpywebio\src'))

从 网页io 导入 启动服务器
从 网页io.输入 导入 *
从 网页io.输出 导入 *
从 网页io.持久输入 导入 *

套路 主函数():
    # 基本输入
    # 年龄 = 输入("你多大了?", 类型='数字')
    # 输出文本(年龄, 类型(年龄))
    # 密码 = 输入("请输入密码", 类型='密码')
    # 输出文本(密码)
    # 礼物 = 选择框("你想要什么礼物?", ['手机', '手表', '手铐'])
    # 礼物 = 选择框("你想要什么礼物?", ['手机', '手表', '手铐'], 多选=真, 值='手机')
    # 输出文本(礼物)
    # 爱好 = 复选框('业余爱好', 选项々=['编程', '看电影', '踢足球'], 行内=真)
    # 输出文本(爱好)
    # 同意 = 单选按钮('使用条款', ['同意', '返回', '退出'], 行内=真)
    # 输出文本(同意)
    # 文本 = 文本域('备忘录', 行数=5, 占位符='重要事项')
    # 文本 = 文本域('备忘录', 行数=5, 占位符='重要事项', 代码=真)
    # 输出文本(文本)
    # 文件 = 文件上传('请选择一个图片', 接受='image/*')
    # 输出文本(文件)
    # 值 = 滑块('呵呵')
    # 输出文本(值)

    # 输入选项
    # 套路 检查年龄(参数):
    #     如果 参数 < 10:
    #         返回 '年龄太小了'
    #     如果 参数 > 60:
    #         返回 '年龄太大了'

    # 年龄 = 输入('你多大了?', 类型='数字', 帮助文本='填写年龄', 必填=真, 验证=检查年龄)

    # 代码编辑区
    # 代码 = 文本域('代码编辑', 代码={
    #     '模式': 'python',
    #     '主题': 'darcula',
    # }, 值='import time\n# blablabla')  # 或者简单地使用 代码=真，代码={}

    # 输入组
    # 每个输入控件务必提供'名称'参数
    # 数据 = 输入组('基本信息', [
    #     输入('年龄', 名称='年龄'),
    #     单选按钮('性别', ['男', '女'], 行内=真, 名称='性别')
    # ])
    # 输出文本(数据)
    # 支持组级验证，接受整个表单数据作为参数

    # 基本输出
    # 输出文本('你吃了吗?')
    # 输出表格([
    #     ['商品', '价格'],
    #     ['苹果', '5.5'],
    #     ['香蕉', '7'],
    # ])
    # # 输出图像(打开('d:\\Pictures\\Saved Pictures\\安装与使用简介.jpg', 'rb').读取())
    # 输出图像('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png')
    # 输出md('# 大标题')
    # 输出md("""### 小标题
    #         ~~此行删除~~""")
    # 输出文件('hw.txt', b'hello world')
    # 弹窗('早上好', '今天跑步了吗?')
    # 通知('你有一条新消息')
    # 在 notebook 这种交互式执行环境中使用 PyWebIO，需要显式调用
    #  显示() 方法来显示输出:
    # 输出文本('你好').显示()

    # 组合输出
    # 输出表格([
    #     ['类型', '内容'],
    #     ['html', 输出html('X<sup>2</sup>')],
    #     ['文本', '<hr/>'],  # 相当于 ['文本', 输出文本('<hr/>')]
    #     ['按钮', 输出按钮々(['A', 'B'], 当点击时=打印)],  
    #     ['markdown', 输出md('`PyWebIO 真棒!`')],
    #     # ['文件', 输出文件('hello.text', b'hello world')],
    #     ['表格', 输出表格([['A', 'B'], ['C', 'D']])]
    # ])

    # 弹窗('哈喽', [
    # 输出html('<h3>Popup Content</h3>'),
    # 'plain html: <br/>',  # 相当于 输出文本('plain html: <br/>')
    # 输出表格([['A', 'B'], ['C', 'D']]),
    # 输出按钮('关闭弹窗()', 当点击时=关闭弹窗)
    # ])

    # 上下文管理器
    # 输出折叠内容('标题', ['内容1', 输出表格([['a', 'b'], ['c', 'd']])])
    # 管 输出折叠内容('标题'):
    #     取 i 于 范围(4):
    #         输出文本(i)

    #     输出表格([
    #     ['商品', '价格'],
    #     ['苹果', '5.5'],
    #     ['香蕉', '7'],
    #     ])

    # 事件回调
    # 从 函数工具 导入 偏函数

    # 套路 编辑行(按钮名称, 行号):
    #     输出文本(f'你点击了第 {行号} 的 "{按钮名称}" 按钮')

    # 输出表格([
    #     ['索引', '操作'],
    #     [1, 输出按钮々(['编辑', '删除'], 当点击时=偏函数(编辑行, 行号=1))],
    #     [2, 输出按钮々(['编辑', '删除'], 当点击时=偏函数(编辑行, 行号=2))],
    #     [3, 输出按钮々(['编辑', '删除'], 当点击时=偏函数(编辑行, 行号=3))],
    # ])

    # 不仅是按钮，所有的输出都可以绑定点击事件。
    # 你可以在输出函数之后调用 当点击时() 方法来绑定点击事件
    # 输出表格([
    #     ['商品', '价格'],
    #     ['苹果', 输出文本('5.5').当点击时(雷锋:通知('你点击了文本'))],
    # ])

    # 当点击时 方法的返回值为对象本身，所以可以继续用于组合输出中

    # 输出内容的容器
    # 管 使用容器('容器1'):  # 创建并进入 '容器1'
    #     输出文本('容器1 中的 文本1')  # 输出内容到 容器1

    # 输出文本('容器1 的父容器中的文本')  # 输出内容到 根容器

    # 管 使用容器('容器1'):  # 进入之前创建的 '容器1'
        # 输出文本('容器1 中的 文本2')  # 输出内容到 容器1
    
    # 管 使用容器('容器1', 清空=真):  # 进入之前创建的 '容器1'
    #     输出文本('容器1 中的 文本2')  # 输出内容到 容器1

    # 导入 时间
    # 从 日时 导入 〇日时

    # @使用容器('时间', 清空=真)
    # 套路 显示时间():
    #     输出文本(〇日时.此刻())

    # 只要 真:
    #     显示时间()
    #     时间.睡眠(1)

    # 容器支持嵌套
    
    # 输出表格([
    #     ['姓名', '爱好'],
    #     ['Tom', 输出容器('爱好', 内容=输出文本('编程'))]  # 爱好 初始化为 编程
    # ])

    # 管 使用容器('爱好', 清空=真):
    #     输出文本('看电影')  # 爱好 重设为 看电影

    # 追加 听音乐、看戏
    # 管 使用容器('爱好'):
    #     输出文本('听音乐')
    #     输出文本('看戏')

    # 将 编程 插到爱好的最前面
    # 输出md('**编程**', 容器='爱好', 位置=〇输出位置.顶部)

    # 布局
    # 输出行([
    #     输出列([
    #         输出代码('A'),
    #         输出行([
    #             输出代码('B1'), 空,  # 空 表示输出项之间的空白
    #             输出代码('B2'), 空,
    #             输出代码('B3'),
    #         ]),
    #         输出代码('C')
    #     ]), 空,
    #     输出代码('D'), 空, 
    #     输出代码('E')
    # ], 大小='30% 10px 30% 10px 30%') # 空 也要指定大小

    # 样式
    # 输出行([
    #     输出文本('你好').样式('color:blue'),
    #     输出md('`markdown`')
    # ]).样式('margin-top: 20px')

    # 输入模块

    # '数据列表' 参数
    # 输入('呵呵', 数据列表=['杨幂', '刘诗诗', '高圆圆'])

    # '操作' 参数
    # import time
    # def set_now_ts(设置值):
    #     设置值(int(time.time()))

    # ts = 输入('时间戳', 类型='数字', 操作=('现在', set_now_ts))
    # from datetime import date,timedelta
    # def select_date(设置值):
    #     with 弹窗('Select Date'):
    #         输出按钮々(['Today'], 当点击时=[lambda: 设置值(date.today(), 'Today')])
    #         输出按钮々(['Yesterday'], 当点击时=[lambda: 设置值(date.today() - timedelta(days=1), 'Yesterday')])

    # d = 输入('Date', 操作=('Select', select_date), 必填=True)
    # 输出text(type(d), d)

    # 下拉选择框
    # 选择 = 选择框('语言', [
    #     ('中文', 1, 真, 假),
    #     ('英语', 2, 假, 假),
    #     ('日语', 3, 假, 真),
    # ])
    # 输出文本(选择)

    # 按钮选项
    # import json  
                
    # info = 输入组('Add user', [
    #     输入('username', 类型='文本', 名称='username', 必填=True),
    #     输入('password', 类型='密码', 名称='password', 必填=True),
    #     按钮选项('actions', [
    #         {'标签': 'Save', '值': 'save'},
    #         {'标签': 'Save and add next', '值': 'save_and_continue'},
    #         {'标签': 'Reset', '类型': '重置', '颜色': '警告'},
    #         {'标签': 'Cancel', '类型': '取消', '颜色': '危险', "禁用": 真},
    #         ['确认1', '确认1'],
    #         ('确认2', '确认2', '提交', 真),
    #         ('取消', '确认3', '取消'),
    #         ['重置', '确认4', '重置']
    #     ], 名称='action', 帮助文本='actions'),
    # ])
    # 输出代码('info = ' + json.dumps(info, indent=4))
    # if info is not None:
    #     if info['action'] == 'save_and_continue':
    #         输出文本('Save and add next...')

    # 输入更新
    # country2city = {
    #     'China': ['Beijing', 'Shanghai', 'Hong Kong'],
    #     'USA': ['New York', 'Los Angeles', 'San Francisco'],
    # }
    # countries = list(country2city.keys())
    # location = 输入组("Select a location", [
    #     选择框('Country', 选项々=countries, 名称='country',
    #         # 当改变时=lambda c: 输入更新('city', 选项々=country2city[c])),
    #         当改变时=lambda c: 输入更新('进度', 值=80)),
    #     选择框('City', 选项々=country2city[countries[0]], 名称='city'),
    #     滑块('呵呵', 名称='进度')
    # ])
    # 输出文本(location, 类型(location))

    # 输出模块
    # 一个容器中各次输出的元素具有像数组一样的索引，
    # 最前面的编号为0，以此往后递增加一；
    # 同样可以使用负数对容器中的元素进行索引，
    # -1表示最后面的元素，-2表示次后面的元素……
    # 管 使用容器('容器1'):
    #     输出文本('A')
    #     输出文本('B', 位置=0)
    #     输出文本('C', 位置=-2)
    #     输出文本('D', 位置=1)

    # 进度条
    # 导入 时间

    # 输出进度条('安装进度')
    # 取 i 于 范围(1, 11):
    #     设置进度条('安装进度', i/10)
    #     时间.睡眠(0.5)

    # 加载动画
    # for shape in ('转圈', '扩大'):
    #     for color in ('主色', '副色', '成功', '危险', '警告', '信息', '浅色', '深色'):
    #         输出文本(shape, color)
    #         输出加载动画(形状=shape, 颜色=color)

    # Use as context manager, the loading prompt will disappear automatically when the context block exits.
    # with 输出加载动画():
    #     时间.睡眠(3)  # Some time-consuming operations
    #     输出文本("宇宙的答案是 42")

    # using style() to set the size of the loading prompt
    # 输出加载动画().样式('width:4rem; height:4rem')

    # 表格
    # 'Name' cell across 2 rows, 'Address' cell across 2 columns
    # 输出表格([
    #     [跨单元格('Name',行=2), 跨单元格('Address', 列=2)],
    #     ['City', 'Country'],
    #     ['Wang', 'Beijing', 'China'],
    #     ['Liu', 'New York', 'America'],
    # ])

    # Use `输出xxx()` in `输出表格()`
    # 输出表格([
    #     ['Type', 'Content'],
    #     ['html', 输出html('X<sup>2</sup>')],
    #     ['text', '<hr/>'],
    #     ['buttons', 输出按钮々(['A', 'B'], 当点击时=...)],  
    #     ['markdown', 输出md('`Awesome PyWebIO!`')],
    #     ['file', 输出文件('hello.text', b'hello world')],
    #     ['table', 输出表格([['A', 'B'], ['C', 'D']])]
    # ])

    # Set table header
    # 输出表格([
    #     ['Wang', 'M', 'China'],
    #     ['Liu', 'W', 'America'],
    # ], 表头=['Name', 'Gender', 'Address'])

    # When ``tdata`` is list of dict
    # 输出表格([
        # {"Course":"OS", "Score": "80"},
        # {"Course":"DB", "Score": "93"},
    # ], 表头=["Course", "Score"])  # or 表头=[(输出md("*Course*"), "Course"), (输出md("*Score*") ,"Score")]

    # 输出表格([
    #     ['C'],
    #     [跨单元格('E', 列=2)],  # 'E' across 2 columns
    # ], 表头=[跨单元格('A', 行=2), 'B'])  # 'A' across 2 rows

    # 输出栅格([
    #     [输出文本('A'), 输出文本('B')],
    #     [跨单元格(输出文本('A'), 列=2)],  # 'A' across 2 columns
    # ])

    # 输出按钮々([  
    #     字典型(标签=i, 值=i, 颜色=i)  
    #     取 i 于 ['主色', '副色', '成功', '危险', '警告', '信息', '浅色', '深色']  
    # ], 当点击时=输出文本)
    # 输出按钮("click me", 当点击时=lambda: 通知("Clicked"), 颜色='成功', 轮廓=真)
    
    # 输出选项卡々([
    #     {'标题': 'Text', '内容': 'Hello world'},
    #     {'标题': 'Markdown', '内容': 输出md('~~Strikethrough~~')},
    #     {'标题': 'More content', '内容': [
    #         输出表格([
    #             ['Commodity', 'Price'],
    #             ['Apple', '5.5'],
    #             ['Banana', '7'],
    #         ]),
    #         输出链接('pywebio', 'https://github.com/wang0618/PyWebIO')
    #     ]},
    # ])

    # import time

    # 输出可滚动内容(输出容器('可滚动'), 高度=200, 保持底部=True)
    # 输出文本("You can click the area to prevent auto scroll.", 容器='可滚动')

    # while 1:
    #     输出文本(time.time(), 容器='可滚动')
    #     time.sleep(0.5)

    # with 弹窗('Popup title') as s:
    #     put_html('<h3>Popup Content</h3>')
    #     输出文本('html: <br/>')
    #     输出按钮々([('清空()', s)], 当点击时=清空)

    # 输出文本('Also work!', 容器=s)

    # 输出栅格([
    #     [输出文本('A'), 输出文本('B'), 输出文本('C')],
    #     [None, 跨单元格(输出文本('D'), 列=2, 行=1)],
    #     [输出文本('E'), 输出文本('F'), 输出文本('G')],
    # ], 单元宽度='100px', 单元高度='100px')

    # 持久输入模块

    # 输出输入框('呵呵')
    # 输出按钮々(['获取持久输入值'], 雷锋 _:输出文本(持久.呵呵))
    # 套路 显示输入值(_):
    #     管 使用容器('容器1', 清空=真):
    #         输出文本(持久.呵呵)
    # 输出按钮々(['获取持久输入值'], 显示输入值)

    # 输出文本域('记事本')
    # 输出选择框('语言1', ['中文', '英文'])
    # 输出复选框('语言2', ['中文', '英文'], 行内=真)
    # 输出单选按钮('语言3', ['中文', '英文'])
    # 输出滑块('进度')
    # 输出按钮选项('按钮组', 按钮々=['重置', '取消', '确认', {'标签': '呵呵', '值': '哈哈', '禁用': 假, '颜色': '深色'}])

    # 导入 time
    # 输出输入框('计数器', 类型='数字', 值=0)

    # while True:
    #     持久.计数器 = 持久.计数器 + 1  # Equivalent to: pin['counter'] = pin['counter'] + 1
    #     time.sleep(1)

    输出输入框('a', 类型='数字', 值=0)
    输出输入框('b', 类型='数字', 值=0)

    while True:
        changed = 持久_等待改变('a', 'b')
        with 使用容器('res', 清空=真):
            输出代码(changed)
            输出文本("a + b = %s" % (持久.a + 持久.b))


如果 __名称__ == '__主体__':
    # 传入 远程访问=真 时，你将会得到一个用于访问当前应用的
    # 临时公网访问地址，其他任何人都可以使用此地址访问你的应用。
    # 远程接入可以很方便地将应用临时分享给其他人。
    启动服务器(主函数, 调试=真, 端口=8080)
